package io.github.hadyang.leetcode.tencent;

import java.util.LinkedList;
import org.junit.Test;

/**
 * 整数反转 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 *
 * <p>示例 1:
 *
 * <p>输入: 123 输出: 321 示例 2:
 *
 * <p>输入: -123 输出: -321 示例 3:
 *
 * <p>输入: 120 输出: 21 注意:
 *
 * <p>假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。
 *
 * @author haoyang.shi
 */
public class Math938 {

  @Test
  public void test() {
    //        System.out.println(reverse(Integer.MAX_VALUE));
    System.out.println(reverse(Integer.MIN_VALUE));
    System.out.println(reverse(-123));
    System.out.println(reverse(120));
  }

  public int reverse(int x) {
    if (x == 0 || x == Integer.MIN_VALUE) {
      return 0;
    }

    LinkedList<Long> t = new LinkedList<>();

    long target = Math.abs((long) x);
    while (target != 0) {
      t.addLast(target % 10);
      target /= 10;
    }

    StringBuilder builder = new StringBuilder(x < 0 ? "-" : "");
    while (true) {
      Long last = t.pollFirst();
      if (last == null) break;

      builder.append(last);
    }

    long res = Long.valueOf(builder.toString());
    if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) return 0;

    return (int) res;
  }
}
